

/**
 * 手写实现 bind 函数
 */
Function.prototype.myBind = function (obj) {
    // 边界检查

    // 获取参数
    const args = Array.prototype.slice.call(arguments, 1);
    // 保存 函数
    const fn = this;

    // 包裹函数
    const bound = function () {
        // 获取 bound() 的参数
        const params = Array.prototype.slice.call(arguments);
        // 确定当前 this，因为 bind 也支持 new 操作
        const thisArg = this.constructor === fn ? this : obj;

        fn.apply(thisArg, args.concat(params));
    }

    // 使 bound 继承 fn 的原型
    const Fn = function () {};
    Fn.prototype = fn;
    bound.prototype = new Fn();

    return bound;
}